// lib/utils/dio_util.dart
import 'dart:io';
import 'package:dio/dio.dart';
import 'package:cookie_jar/cookie_jar.dart';
import 'package:dio_cookie_manager/dio_cookie_manager.dart';
import 'package:path_provider/path_provider.dart';

const String env = String.fromEnvironment('ENV', defaultValue: 'devandroid');

class DioUtil {
  // 单例模式
  static final DioUtil _instance = DioUtil._internal();
  factory DioUtil() => _instance;
  DioUtil._internal();
  static String get baseUrl {
    // switch (env) {
    //   case 'devbrowser':
    //     return 'http://127.0.0.1:3000';
    //   case 'devandroid':
    //     return 'http://10.0.2.2:3000';
    //   default:
    //     return 'http://10.0.2.2:3000';
    // }
    return 'http://www.codeman.ink/api';
  }

  late Dio _dio;
  late PersistCookieJar _cookieJar;
  bool _isInitialized = false;

  // 初始化方法（必须在首次使用前调用）
  Future<void> init() async {
    if (_isInitialized) return;

    // 初始化 Dio
    _dio = Dio(
      BaseOptions(
        // 如果是真机运行 要求使用本地服务的ipconfig地址 并且处于同一局域网
        // http://127.0.0.1:3000 游览器环境 ios模拟器环境
        // http://10.0.2.2:3000 安卓模拟器环境
        baseUrl: baseUrl,
        connectTimeout: const Duration(seconds: 10),
        receiveTimeout: const Duration(seconds: 10),
        headers: {'Content-Type': 'application/json'},
      ),
    );

    // 初始化 Cookie 持久化存储
    final Directory appDocDir = await getApplicationDocumentsDirectory();
    _cookieJar = PersistCookieJar(
      storage: FileStorage('${appDocDir.path}/cookies'),
    );

    // 添加 Cookie 管理拦截器
    _dio.interceptors.add(CookieManager(_cookieJar));

    // 添加日志拦截器（可选）
    // _dio.interceptors.add(LogInterceptor(
    //   request: true,
    //   responseBody: true,
    //   requestBody: true,
    // ));

    _isInitialized = true;
  }

  // 检查是否已初始化
  void _checkInitialized() {
    if (!_isInitialized) {
      throw Exception('DioUtil 未初始化，请先调用 init() 方法');
    }
  }

  //------------------ 请求方法封装 -------------------//

  Future<Response> get(
    String path, {
    Map<String, dynamic>? queryParams,
    Options? options,
  }) async {
    _checkInitialized();
    return await _dio.get(
      path,
      queryParameters: queryParams,
      options: options,
    );
  }

  Future<Response> post(
    String path, {
    dynamic data,
    Map<String, dynamic>? queryParams,
    Options? options,
  }) async {
    _checkInitialized();
    return await _dio.post(
      path,
      data: data,
      queryParameters: queryParams,
      options: options,
    );
  }

  Future<Response> put(
    String path, {
    dynamic data,
    Map<String, dynamic>? queryParams,
    Options? options,
  }) async {
    _checkInitialized();
    return await _dio.put(
      path,
      data: data,
      queryParameters: queryParams,
      options: options,
    );
  }

  Future<Response> delete(
    String path, {
    dynamic data,
    Map<String, dynamic>? queryParams,
    Options? options,
  }) async {
    _checkInitialized();
    return await _dio.delete(
      path,
      data: data,
      queryParameters: queryParams,
      options: options,
    );
  }

  //------------------ Cookie 管理 -------------------//

  /// 清除所有 Cookie（退出登录时调用）
  Future<void> clearCookies() async {
    _checkInitialized();
    await _cookieJar.deleteAll();
  }

  /// 获取当前所有 Cookie
  Future<List<Cookie>> getCookies(String url) async {
    _checkInitialized();
    final uri = Uri.parse(url);
    return _cookieJar.loadForRequest(uri);
  }

  /// 判断是否处于登录状态（是否存在有效 Cookie）
  Future<bool> isLoggedIn() async {
    _checkInitialized();
    try {
      // 加载当前域名下的所有 Cookie
      final uri = Uri.parse('http://127.0.0.1:3000');
      final cookies = await _cookieJar.loadForRequest(uri);

      // 检查是否存在任意 Cookie（可根据具体业务调整逻辑，例如检查特定名称的 Cookie）
      return cookies.isNotEmpty;
    } catch (e) {
      return false;
    }
  }

  //------------------ 其他工具方法 -------------------//

  /// 获取 Dio 实例（如需直接操作 Dio）
  Dio get dio => _dio;

  /// 获取 CookieJar 实例
  PersistCookieJar get cookieJar => _cookieJar;
}
